/**
 * pharma-business - 28 mai 2011 guillaume
 */
package org.bspv.pharma.business;

import java.util.List;

import org.bspv.pharma.common.exception.EntityNotFoundException;
import org.bspv.pharma.common.exception.ViolatedBusinessRuleException;
import org.bspv.pharma.model.Order;
import org.bspv.pharma.model.OrderDetail;
import org.bspv.pharma.model.TypeOfSupply;
import org.bspv.pharma.model.User;

/**
 * Interface du service métier de gestion des commandes.
 * 
 * @author guillaume
 * 
 */
public interface OrderManagementBusinessService {

    /**
     * Supprime la commande en paramètre.
     * 
     * @param order
     *            Commande à supprimer
     * @param user
     *            Utilisateur responsable de la suppression (logique)
     * @param comment
     *            Commentaire
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la suppression
     */
    void deleteOrder(Order order,String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Annule la commande en paramètre.
     * 
     * @param order
     *            Commande à annuler
     * @param comment
     *            Commentaire
     * @param user
     *            Utilisateur responsable de l'annulation
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour l'annulation
     */
    void cancelOrder(Order order, String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Envoi la commande en paramètre.
     * 
     * @param order
     *            Commande à annuler
     * @param comment
     *            Commentaire
     * @param user
     *            Utilisateur responsable de l'annulation
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour l'envoi
     */
    void sendOrder(Order order, String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Début de la réception d'une commande.
     * 
     * @param order
     *            commande à réceptionner
     * @param comment
     *            Commentaire
     * @param user
     *            Utilisateur responsable de la réception
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la réception
     */
    void beginOrderDelivery(Order order, String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Fin de la réception d'une commande. (mise à jour de la commande)
     * 
     * @param order
     *            La commande à réceptionner
     * @param comment
     *            Commentaire
     * @param user
     *            Utilisateur responsable de la réception
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la clôture de la réception
     */
    void completeOrderDelivery(Order order, String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Enregistre la commande en paramètre et son évènement de création.
     * 
     * @param order
     *            Commande à créer
     * @param comment
     *            Commentaire
     * @param user
     *            Utilisateur responsable de la création
     * @return La commande nouvellement créée
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la création
     */
    Order createOrder(Order order, String comment, User user) throws ViolatedBusinessRuleException;

    /**
     * Ajoute une quantité de fournitures à une commande.
     * 
     * @param order
     *            La commande
     * @param typeOfSupply
     *            Type de fourniture
     * @param quantity
     *            Quantité
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si l'ajout de fourniture à la commande n'est pas possible
     */
    void updateOrderDetail(Order order, TypeOfSupply typeOfSupply, Integer quantity)
            throws ViolatedBusinessRuleException;

    /**
     * Retourne une commande à partir de son identifiant.
     * 
     * @param id
     *            Identifiant de la commande
     * @return La commande
     */
    Order findOrder(Long id);

    /**
     * Retourne la liste des détails d'une commande
     * 
     * @param order
     *            La commande.
     * @return Liste des détails de la commande
     */
    List<OrderDetail> findOrderDetails(Order order) throws EntityNotFoundException;

}
